// encoding utf-8
#ifndef __QyGLSky__
#define __QyGLSky__

#include <QtCore/QString>
#include <QyMath.h>
#include "QyGLObject.h"

namespace QyGL {

/*! \brief Базовый класс для отображения окружения (skybox, skysphere, e.t.c)
	\ingroup QyOpenGL
*/
class Sky {
public:
	virtual ~Sky() {}

	virtual void paint() = 0; //!< Нарисовать скайбокс

	virtual QyMath::Point boundingMax() const { return p_max; } //!< Минимальные координаты(точка) обрамляющего ящика окружения
	virtual QyMath::Point boundingMin() const { return p_min; } //!< Максимальные координаты(точка) обрамляющего ящика окружения

	void setBoundingMin( const QyMath::Point & min ) { p_min = min; updateBounding(); } //!< Установить минимальные координаты(точка) обрамляющего ящика окружения
	void setBoundingMax( const QyMath::Point & max ) { p_max = max; updateBounding(); } //!< Установить максимальные координаты(точка) обрамляющего ящика окружения
	void setBounding( const QyMath::Point & min, const QyMath::Point & max ) //!< Установить координаты обрамляющего ящика окружения
		{ p_max = max; p_min = min; updateBounding(); }

protected:
	virtual void updateBounding() = 0; //!< Метод вызывается когда изменены координаты обрамляющего ящика

private:
	QyMath::Point p_min,
		p_max;

};

/*! \brief Классический скайбокс
	\ingroup QyOpenGL
*/
class SkyBox : public Sky {
public:
	//! Положение текстур
	enum TextureAlignment{
		Top     = 0, //!<
		Bottom  = 1, //!<
		Left    = 2, //!<
		Right   = 3, //!<
		Front   = 4, //!<
		Back    = 5 //!<
	};

	explicit SkyBox(
		const Texture & topTexture = Texture(), const Texture & bottomTexture = Texture(),
		const Texture & leftTexture = Texture(), const Texture & rightTexture = Texture(),
		const Texture & frontTexture = Texture(), const Texture & backTexture = Texture() );
	virtual ~SkyBox() {}

	Texture texture( quint32 align ) const { return ( align < 6 ) ? objs[align].texture() : Texture(); } //!< Получить текстуру стенки ящика

	virtual void paint();
	void setTexture( quint32 align, const Texture & texture )
		{ if ( align < 6 ) objs[align].setTexture(texture); else qWarning("Align out of range"); } //!< Установить текстуру стенки ящика

	QyGL::Object objs[6]; //!< стенки ящика

protected:
	virtual void updateBounding();

};

};

#endif//__QyGLSky__
